package org.eiahe.hr.attendance.service;

import org.eiahe.hr.attendance.domain.AttendanceRecord;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 考勤核心算法Service接口
 *
 * @author zhangnn
 */
public interface IAttendanceAlgorithmService {

    /**
     * 考勤状态判定算法
     * 读取班次、节假日、特殊规则综合判定
     *
     * @param employeeNo     工号
     * @param attendanceDate 考勤日期
     * @param clockTime      打卡时间
     * @param clockType      打卡类型(1上班 2下班)
     * @return 考勤状态(0正常 1迟到 2早退 3旷工 4请假 5外勤 6非工作日)
     */
    String determineAttendanceStatus(String employeeNo, LocalDate attendanceDate, LocalTime clockTime,
            String clockType);

    /**
     * 计算请假天数(扣除午休、非工作日)
     *
     * @param employeeNo 工号
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @return 实际请假天数(精确到0.5天)
     */
    BigDecimal calculateLeaveDays(String employeeNo, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 重复打卡处理逻辑
     * 判断是否为重复打卡，如果重复则标记
     *
     * @param record 考勤记录
     * @return 是否为重复打卡(0否 1是)
     */
    String handleDuplicateClock(AttendanceRecord record);

    /**
     * 综合处理考勤记录
     * 在保存考勤记录时调用，自动判定状态、处理重复打卡
     *
     * @param record 考勤记录
     */
    void processAttendanceRecord(AttendanceRecord record);
}
